home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Add-Ons / After Dark / ScreenFlip 1.5 / Source / AD Shared Resources / Fade.c next >
Encoding:
Text File  |  1995-11-06  |  5.1 KB  |  214 lines  |  [TEXT/R*ch]

  1. /********************************************************************************
  2.          Copyright  ©  N. Jonas Englund, 1993.    All Rights Reserved.
  3.          
  4.          WARNING: This file has been modified by Leo Breebaart. Don't hold
  5.          Jonas responsible for my hacks. If you want his original code,
  6.          e-mail me and I'll send you a copy.
  7.  ********************************************************************************
  8.  
  9.      FILE:        Fade.c
  10.      
  11.      PURPOSE:    'clut' fading functions
  12.  
  13.  ********************************************************************************/
  14.  
  15. //================================= INCLUDES ====================================
  16.  
  17. #include "Fade.h"
  18.  
  19. //================================= FUNCTIONS ===================================
  20.  
  21. void copy_cluts     (GDHandle);
  22. void calc_fade     (short, FadeValues*);
  23. void fade_out     (short, FadeValues);
  24. void fade_in     (short, FadeValues);
  25. void black_out     (void);
  26.  
  27. //================================== GLOBALS ====================================
  28.  
  29. CTabHandle     gFade,            // 'clut' to alter with fading functions
  30.             gOrig;            // 'clut' to hold a copy of original
  31. Handle        gTempH;            //  temporary handle to copy 'clut'
  32.  
  33. /********************************** fade_screen *********************************/
  34. extern
  35. void fade_screen(short speed, Boolean fadeOut)
  36. {
  37.     GDHandle     oldDev, hGD;
  38.     FadeValues    rgbs;
  39.     
  40.     oldDev = GetGDevice();
  41.     hGD = GetMainDevice();
  42.     SetGDevice(hGD);
  43.     
  44.     copy_cluts(hGD);
  45.     calc_fade(speed, &rgbs);
  46.  
  47.     if (fadeOut)
  48.         fade_out(speed, rgbs);
  49.     else
  50.         fade_in(speed, rgbs);
  51.  
  52.     restore_clut();
  53.     SetGDevice(oldDev);
  54.  
  55.     DisposeHandle(gTempH);
  56. }
  57. /*** fade_screen ***/
  58.  
  59. extern
  60. void setup_cluts()
  61. {
  62.     GDHandle     oldDev, hGD;
  63.     
  64.     oldDev = GetGDevice();
  65.     hGD = GetMainDevice();
  66.     SetGDevice(hGD);
  67.     
  68.     copy_cluts(hGD);
  69.     SetGDevice(oldDev);
  70. }
  71.  
  72. /********************************** copy_cluts **********************************/
  73. static
  74. void copy_cluts(GDHandle hGD)
  75. {    
  76.     gFade = (*(*hGD)->gdPMap)->pmTable;
  77.     gTempH = (Handle) (*(*hGD)->gdPMap)->pmTable;
  78.     HandToHand(&gTempH);
  79.     gOrig = (CTabHandle) gTempH;
  80.     
  81.     HLock((Handle) gFade);
  82.     HLock((Handle) gOrig);
  83. }
  84.  
  85. /*********************************** calc_fade **********************************/
  86. static
  87. void calc_fade(short speed, FadeValues *rgbs)
  88. {
  89.     short    i;
  90.     
  91.     for (i = 0; i < MAXBYTE; i++)
  92.     {
  93.         rgbs->reds[i]   = (*gFade)->ctTable[i].rgb.red   / speed;
  94.         rgbs->greens[i] = (*gFade)->ctTable[i].rgb.green / speed;
  95.         rgbs->blues[i]  = (*gFade)->ctTable[i].rgb.blue  / speed;
  96.     }
  97. }
  98.  
  99. /*********************************** fade_out ***********************************/
  100. static
  101. void fade_out(short speed, FadeValues rgbs)
  102. {
  103.     short     i, j;
  104.     
  105.     for (j = speed; j >= 0; j--)
  106.     {
  107.         for (i = 0; i < MAXBYTE; i++)
  108.         {
  109.             if ((*gFade)->ctTable[i].rgb.red   > rgbs.reds[i])
  110.                 (*gFade)->ctTable[i].rgb.red   -= rgbs.reds[i];
  111.             if ((*gFade)->ctTable[i].rgb.green > rgbs.greens[i])
  112.                 (*gFade)->ctTable[i].rgb.green -= rgbs.greens[i];
  113.             if ((*gFade)->ctTable[i].rgb.blue  > rgbs.blues[i])
  114.                 (*gFade)->ctTable[i].rgb.blue  -= rgbs.blues[i];
  115.         }
  116.         SetEntries(0,  MAXBYTE-1, (*gFade)->ctTable);
  117.     }
  118.     black_out();
  119. }
  120.  
  121. /************************************ fade_in ***********************************/
  122. static
  123. void fade_in(short speed, FadeValues rgbs)
  124. {
  125.     short     i, j;
  126.     
  127.     black_out();
  128.  
  129.     for (j = 0; j < speed; j++)
  130.     {
  131.         for (i = 0; i < MAXBYTE; i++)
  132.         {
  133.             if ((*gFade)->ctTable[i].rgb.red   < (*gOrig)->ctTable[i].rgb.red)
  134.                 (*gFade)->ctTable[i].rgb.red   += rgbs.reds[i];
  135.             if ((*gFade)->ctTable[i].rgb.green < (*gOrig)->ctTable[i].rgb.green)
  136.                 (*gFade)->ctTable[i].rgb.green += rgbs.greens[i];
  137.             if ((*gFade)->ctTable[i].rgb.blue  < (*gOrig)->ctTable[i].rgb.blue)
  138.                 (*gFade)->ctTable[i].rgb.blue  += rgbs.blues[i];
  139.         }
  140.         SetEntries(0, MAXBYTE-1, (*gFade)->ctTable);
  141.     }
  142. }
  143.  
  144. /*********************************** black_out **********************************/
  145. static
  146. void black_out(void)
  147. {
  148.     short     i;
  149.     
  150.     for (i = 0; i < MAXBYTE; i++)
  151.     {
  152.         (*gFade)->ctTable[i].rgb.red   = 0;
  153.         (*gFade)->ctTable[i].rgb.green = 0;
  154.         (*gFade)->ctTable[i].rgb.blue  = 0;
  155.     }
  156.     SetEntries(0, MAXBYTE-1, (*gFade)->ctTable);
  157. }
  158.  
  159. /********************************** restore_clut ********************************/
  160. void restore_clut(void)
  161. {
  162.     short     i;
  163.     
  164.     for (i = 0; i < MAXBYTE; i++)
  165.     {
  166.         (*gFade)->ctTable[i].rgb.red   = (*gOrig)->ctTable[i].rgb.red;
  167.         (*gFade)->ctTable[i].rgb.green = (*gOrig)->ctTable[i].rgb.green;
  168.         (*gFade)->ctTable[i].rgb.blue  = (*gOrig)->ctTable[i].rgb.blue;
  169.     }
  170.     (*gFade)->ctSeed = GetCTSeed();
  171.     MakeITable(nil, nil, 0);
  172.     
  173.     HUnlock((Handle) gFade);
  174.     HUnlock((Handle) gOrig);
  175. }
  176.  
  177.  
  178. void install_clut (short clutID)
  179. {
  180.     short i;
  181.     CTabHandle newClut;
  182.  
  183.     GDHandle     oldDev, hGD;
  184.     
  185.     oldDev = GetGDevice();
  186.     hGD = GetMainDevice();
  187.     SetGDevice(hGD);
  188.     
  189.     gFade = (*(*hGD)->gdPMap)->pmTable;
  190.  
  191.     if ((newClut = GetCTable(clutID)) == nil)
  192.     {
  193.         SysBeep(2);
  194.         return;
  195.     }
  196.     
  197.     HLock((Handle) gFade);
  198.     HLock((Handle) newClut);
  199.     
  200.     for (i = 0; i < MAXBYTE; i++)
  201.     {
  202.         (*gFade)->ctTable[i].rgb.red   = (*newClut)->ctTable[i].rgb.red;
  203.         (*gFade)->ctTable[i].rgb.green = (*newClut)->ctTable[i].rgb.green;
  204.         (*gFade)->ctTable[i].rgb.blue  = (*newClut)->ctTable[i].rgb.blue;
  205.     }
  206.     
  207.     SetEntries(0, MAXBYTE-1, (*gFade)->ctTable);
  208.     
  209.     HUnlock((Handle) gFade);
  210.     HUnlock((Handle) newClut);
  211.  
  212.     SetGDevice(oldDev);
  213. }
  214.